Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Звіт
Про виконання лабораторної роботи №2
«Структури даних для використання системних функцій»
Тема – структури даних для використання системних функцій.
Мета – навчитися будувати структури даних для використання функцій Win32API при програмуванні в операційній системі Windows.
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Для використання більш складних функцій API необхідно використовувати спеціальні структури даних. Вся концепція програмування в WINDOWS основана на чіткому впорядкуванні структур даних, пов'язаних із ними програм-функцій та констант-параметрів. Структура це сукупність змінних, котрі об’єднані в один блок. Треба пам’ятати що структура в асемблері це логічне значення, насправді це масив значень (байтів), де кожен елемент структури займає конкретне місце у масиві.
Структури можуть розміщатися як в глобальній пам’яті (сегмент даних, виділена пам’ять), так і в локальній (сегмент стеку). В Асемблері є можливість визначити структуру як шаблон, і використовувати його як спеціальний тип даних, наприклад, тип SYSTEMTIME (опис структури взятий з файлу Windows.inc):
SYSTEMTIME STRUCT
WYear WORD ?
WMonth WORD ?
WDayOfWeek WORD ?
WDay WORD ?
WHour WORD ?
WMinute WORD ?
WSecond WORD ?
WMilliseconds WORD ?
SYSTEMTIME ENDS
Де WORD (dw) –довжина даних, 2 байти; а символ „?”, означає що по замовчуванню значення змінної невідоме, тобто буде залежати від сегмента в якому буде оголошена структура. Зауважте, що слово struct вказує на те, що данні реально не існують, а це ЛИШЕ ОПИС ШАБЛОНУ. Дані починають існувати коли оголошується змінна певного шаблонного типу, наприклад:
LOCAL Time: SYSTEMTIME
Де Time – це екземпляр структури, типу SYSTEMTIME. Зверніть увагу на слово LOCAL, котре вказує на те, що данні Є ЛОКАЛЬНИМИ, тобто знаходяться в сегменті стеку. Початково у локальних змінних вміст начення буде „сміття”, тобто данні, котрі були в стеці до виклику функції, в глобальних значення по замовчуванню.
Екземпляр структури, можна оголосити глобально. В сегменті даних:
.data? ; сегмент невизначених змінних
; змінна глобальна, початкові значення елементів „сміття”
;використовується якщо ми початково збираємось записати у структуру значення, а потім ;використовувати
Time SYSTEMTIME < ? >
.datа ; сегмент визначених змінних
; змінна глобальна, початкові значення елементів „0”.
Time SYSTEMTIME < 0 >
Для доступу до елементів екземпляру використовується крапка, так само як до записів в мові Pascal:
mov Time.wYear, 2006
Не забувайте що елементи екземпляру структури є адресою, тобто вказує на комірку пам‘яті, тому не можна робити запис з комірки в комірку на пряму !!!.
mov Time.wYear, Time. wMinute
Ця проблема вирішується за допомогою регістрів або стеку.
За допомогою регістрів :
mov ax, Time. wMinute
mov Time.wYear,ax
Ми використовуємо не розширений регістр eax (4 байти) а регістр ax (2 байти), тому що дані wMinute та wYear мають розмір 2 байти;
або за допомогою стеку :
push Time. wMinute
pop Time.wYear
Елементами таких структур можуть бути інші структури і т.д., в такому випадку для звернення до елементів використовується стільки крапок скільки існує рівнів структур.
Фактично існує два типа функцій API:
а) функції, які виконують будь-яку дію;
б) функції, які отримують будь-яку інформацію.
У даній лабораторній роботі треба отримати та розшифрувати одну з таких довідкових структур, яка містить інформацію про локальний час. Для виклику довільної довідкової функції необхідно вказати адресу місця в пам'яті, куди буде записана довідкова інформація. Цю адресу, як параметр функції, завжди перед викликом функції треба опустити в стек.
В лабораторній роботі необхідно також звернути увагу на те, що використовується унікальна АРІ функція wsprintf, котра не очищує стек (цей недолік виправлений у Windows XP). Це пов’язано з тим, що вона може містити не фіксовану кількість параметрів. В такому ви...